#!/usr/bin/env python
# coding: utf-8

# In[1]:


#smote模块
import sys
get_ipython().system('{sys.executable} -m pip install imbalanced-learn')


# In[6]:


import pandas as pd
from imblearn.over_sampling import SMOTE

# 读取标准化后的数据集
df = pd.read_csv('train_set_z-score.csv')

# ================== 新增模块：布尔值转整数 ==================
# 检测所有布尔型列（包括True/False或1/0但类型为object的情况）
bool_cols = df.select_dtypes(include=['bool', 'object']).columns

# 将布尔列统一转换为整数0/1
for col in bool_cols:
    # 处理混合格式（如既有True/False又有1/0的情况）
    df[col] = df[col].replace({True: 1, False: 0, 'True': 1, 'False': 0})
    df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0).astype(int)
# ==========================================================

# 分离特征和标签
X = df.drop(columns=['label'])
y = df['label']

# 初始化SMOTE（生成280个新负样本）
sm = SMOTE(sampling_strategy={0:490},  # 指定负类目标数量
           k_neighbors=5,              # 使用5个最近邻生成样本
           random_state=42)

# 执行过采样
X_res, y_res = sm.fit_resample(X, y)

# 处理二值特征（将SMOTE可能生成的浮点数四舍五入为整数）
binary_cols = [col for col in X.columns if col.startswith(('checking_account','purpose','savings_account'))]
X_res[binary_cols] = X_res[binary_cols].round().astype(int)

# 验证结果
print(f"原始数据分布:\n{y.value_counts()}")
print(f"\nSMOTE后分布:\n{y_res.value_counts()}")
print(f"\n新增负样本数量: {(y_res == 0).sum() - (y == 0).sum()}")

# 保存处理后的数据集
res_df = pd.concat([X_res, y_res], axis=1)
res_df.to_csv('smote_balanced_dataset.csv', index=False)


# In[ ]:




